package cn.akwangl.design.pattern.behavioral.observerpattern.v3;

import java.util.ArrayList;
import java.util.EventListener;
import java.util.Iterator;
import java.util.List;

/**
 * 事件源/观察者目标类
 *
 * @author youyongkun
 * @date 2021/12/6 16:24
 */
public class BellEventSource implements EventListener {
    private List<BellEventListener> listener = new ArrayList<>();

    public void addPersonListener(BellEventListener ren) {
        listener.add(ren);
    }

    /**
     * 事件触发器：敲钟，当铃声sound的值发生变化时，触发事件。
     *
     * @param sound
     */
    public void ring(boolean sound) {
        String type = sound ? "上课铃" : "下课铃";
        System.out.println(type + "响！");
        RingEvent event = new RingEvent(this, sound);
        //通知注册在该事件源上的所有监听器
        notifies(event);
    }

    /**
     * 当事件发生时,通知绑定在该事件源上的所有监听器做出反应（调用事件处理方法）
     *
     * @param e
     */
    protected void notifies(RingEvent e) {
        BellEventListener ren = null;
        Iterator<BellEventListener> iterator = listener.iterator();
        while (iterator.hasNext()) {
            ren = iterator.next();
            ren.heardBell(e);
        }
    }


}
